iT邦幫忙

2022 iThome 鐵人賽

DAY 6
0
Modern Web

傳承D的意志~ 邁向Django的偉大航道系列 第 6

[Day 06] 有關係就是有關係,Django的關聯資料庫篇

  • 分享至 

  • xImage
  •  

嗨大家好,我是Sean!
昨天講完了model以及migration的基礎操作後,
我們進一步來進入model的奧秘:關聯資料庫(Relational database)的領域。
https://ithelp.ithome.com.tw/upload/images/20220921/20151096RHupI7dIJF.png

關聯資料庫(Relational database)


甚麼是關聯資料庫

關聯資料庫,就是建立在關聯模型上的資料庫。聽起來還是很抽象?
關聯其實就是model之間有關係,可以互相聯繫、互補的意思。

舉個例子來說,當我們現在有個People的model,可能有另一個model叫Group。那麼可以依靠People中的欄位來關聯到Group這個table,表示People屬於某個Group中的object。
ex. class People

  • name
  • age
  • ...
  • group = models.ForeignKey(Group) ==> class Group

這樣的關聯關係有下列三種,(看起來很像國中方程式與解的對應關係...):

  • 一對一
  • 多對一
  • 多對多

關聯對應關係


接下來,我們來分別解析三種不同的對應關係,應該如何應用在不同的情境當中!
讓我們假設有一個左表來對應一個右表,並在看到表的同時,照著以下的步驟分析:

  • 第一步: 分析表
    • 分析一: 左表的多條紀錄是否可對應右表的一條紀錄
    • 分析二: 右表的多條紀錄是否可對應左表的一條紀錄
  • 第二步: 總結分析,確認表與表之間的對應關係

多對一 (ForeignKey)

  • 若只有分析一成立,左表多對一右表,外來鍵foreign key創建在左表,關聯指向右表
  • 若只有分析二成立,右表多對一左表,外來鍵foreign key創建在右表,關聯指向左表

最常見的關聯型態,便是我們的多對一關係,需設置ForeignKey,也就是外來鍵。
簡單舉例來說:
左表為People,右表為國籍(一個人只有單一國籍):
那麼左表的多條紀錄(多個人),可能可以對應右表的一條紀錄(其中一個的國籍)
ex. class People

  • name
  • age
  • ...
  • nation = models.ForeignKey(Nationality, ) ==>對應 class Nationality

確認本關係為多對一的對應關係


一對一 (OneToOneField)

若分析一及分析二皆不成立,則左表的一條紀錄唯一對應右表的一條紀錄。
此時,我們可以在左表設置OneToOneField,指向右表即可。

一對一關係,在Django中,最常使用的地方在於原生的User以及我們客製化的UserProfile model。
這麼做的好處在於,善加利用原生的User model的同時,可以利用我們寫的UserProfile來一對一,對應User表裡的每一個使用者。

通常會將OneToOneField的欄位寫在第一個,很容易就可以看清楚對應的表是哪個

ex. class UserProfile

  • user = models.OneToOneField(User,) ==>對應 auth.User
  • phone
  • ...

多對多 (ManyToManyField)

若分析一及分析二同時成立,兩表為雙向多對一,即多對多。
需創建一張新表,專門存放左右二表的關係,關聯字段寫在新表中

舉例來說,商品與種類的關係,通常為多對多之關係。一個商品可以隸屬於多種分類中,而一種分類類別裡,也可以有多種商品被分類其中。
ex.
class Product: <===> class Category
category = models.ManyToManyField(Category, through='Product_Category', through_fields=('product', 'category'))

class Product_Category:
product = models.ForeignKey(Product, )
category = models.ForeignKey(Category, )

剛開始,看起來會有點模糊,但我覺得這樣的分析對我來說,可以很清楚直觀的判斷model與model之間的對應關係,推薦給大家這樣的思考邏輯。

那麼今天的文章就到此結束,
希望以後你看到表的關係,可以覺得'沒關係,輕鬆'的解決xDD 快速判斷表表之間的關係。
我是Sean,你各位海上的人,我們明天見!
https://ithelp.ithome.com.tw/upload/images/20220921/20151096X5o5av00S8.jpg


上一篇
[Day 05] 參見Django的三大將之一: Model - Migration篇
下一篇
[Day 07] 不僅Django,可能是後端最重要的資料庫設計
系列文
傳承D的意志~ 邁向Django的偉大航道30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言